 struct ListNode {
      int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
 };
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        // 处理边界情况
        if (!head || !head->next || k == 0) {
            return head;
        }

        // 统计链表长度并找到尾节点
        int len = 1;
        ListNode* tail = head;
        while (tail->next) {
            tail = tail->next;
            len++;
        }

        // 计算有效旋转次数
        k = k % len;
        if (k == 0) {
            return head;
        }

        // 构成环
        tail->next = head;

        // 找到断开点（倒数第k+1个节点）
        ListNode* breakNode = head;
        for (int i = 0; i < len - k - 1; i++) {
            breakNode = breakNode->next;
        }

        // 新头节点是断开点的下一个节点
        ListNode* newHead = breakNode->next;
        // 断开环
        breakNode->next = nullptr;

        return newHead;
    }
};